#ifndef __tlv_cmd_H__
#define __tlv_cmd_H__

#include <stdint.h>

#define PADDING_SIZE 4
#ifdef _MSC_VER
#define ALIGN4 __declspec(align(4))
#else
#define ALIGN4 __attribute__((aligned(4)))
#endif

#ifdef _WIN32
#undef ALIGN4
#define ALIGN4 __declspec(align(4))
#endif

#ifdef _WIN64
#undef ALIGN4
#define ALIGN4 __declspec(align(4))
#endif

/****************************************************************************************************
 * 1.激光/电衰
 * 2.定义硬件设备号
 *****************************************************************************************************/
enum DeviceTypeEn
{
    DEVICE_TYPE_MOTOR_E = 0x01,
    DEVICE_TYPE_LASER_E,
    DEVICE_TYPE_NONE_E,
    DEVICE_TYPE_COUNT_E
} ALIGN4;

/****************************************************************************************************
 * 1.激光/电衰
 * 2.定义驱动板id
 *****************************************************************************************************/
enum ChipIdEn
{
    CHIP_ID_1_E = 0x01,
    CHIP_ID_2_E,
    CHIP_ID_3_E,
    CHIP_ID_4_E,
	CHIP_ID_5_E,
	CHIP_ID_6_E,
    CHIP_ID_NONE_E,
    CHIP_ID_COUNT_E
} ALIGN4;

/****************************************************************************************************
 * 1.激光/电衰
 * 2.定义软件模块ID
 *****************************************************************************************************/
enum ModuleTypEn
{
    // 电衰模块
    MODULE_TYPE_MOTOR_MESSAGE_E = 0x01,
    // 激光模块
    MODULE_TYPE_LASER_MESSAGE_E,
    // Bootloader升级模块（暂未使用，用最原始的升级代码）
    MODULE_TYPE_BOOT_UPDATE_MESSAGE_E,
    MODULE_TYPE_NONE_E,
    MODULE_TYPE_COUNT_E,
} ALIGN4;

/****************************************************************************************************
 * 1.激光/电衰
 * 2.功能指令
 *****************************************************************************************************/
enum FuncLaserTypeEn
{
    FUNC_LASER_TYPE_SWITCH_E = 0x01,        //设置开关
    FUNC_LASER_TYPE_READ_ACTURAL_MESSAGE_E, //读取实际值
    FUNC_LASER_TYPE_READ_EEPROM_MESSAGE_E,  //读取从EEPROM的值
    FUNC_LASER_TYPE_SET_ACTURAL_MESSAGE_E,  //设置实际值
    FUNC_LASER_TYPE_SET_EEPROM_MESSAGE_E,   //设置到EEPROM的值
    FUNC_LASER_TYPE_VENSION_E,              //查询版本号、反馈初始错误码
    FUNC_LASER_TYPE_RESET_E,                //软件复位
    FUNC_LASER_TYPE_POLL_E,                 //轮询指令（该指令仅包含错误码，且只有该指令包含实时错误码）
    FUNC_LASER_TYPE_REFRESH_CODE_E,         //错误码刷新
    FUNC_LASER_TYPE_PARAMETER_E,            //获取硬件相关参数
    FUNC_LASER_TYPE_COUNT_E
} ALIGN4;

enum FuncMotorTypeEn
{
    FUNC_MOTOR_TYPE_READ_POSITION_E = 0x01, //读取位置
    FUNC_MOTOR_TYPE_RUN_POSITION_E,         //转动位置
    FUNC_MOTOR_TYPE_SAVE_POSITION_E,        //保存位置
    FUNC_MOTOR_TYPE_VENSION_E,              //查询版本号和初始错误码
    FUNC_MOTOR_TYPE_RESET_E,                //软件复位
    FUNC_MOTOR_TYPE_POLL_E,                 //轮询指令（该指令仅包含错误码，且只有该指令包含实时错误码）
    FUNC_MOTOR_TYPE_REFRESH_CODE_E,         //错误码刷新
    FUNC_MOTOR_TYPE_PARAMETER_E,            //获取硬件相关参数
    FUNC_MOTOR_TYPE_COUNT_E
} ALIGN4;

/****************************************************************************************************
 * 1.激光/电衰
 * 2.错误码
 *****************************************************************************************************/
enum ErrorSystemInformEn
{
    s_SysTick_Abnormal_Flag = 0,
    s_Id_Abnormal_Flag,
    s_EEProm_Wt_Abnormal_Flag,
    s_EEProm_Rd_Abnormal_Flag,
    s_Write_Value_Abnormal_Flag,
    s_Read_Value_Abnormal_Flag,
    s_Error_Flag_Count
} ALIGN4;

enum ErrorLaserInformEn
{
    l_Ovp_Flag = s_Error_Flag_Count,
    l_Ocp_Flag,
    l_Ot_Flag,
    l_Ut_Flag,
    l_ADC1119_Abnormal_Flag,
    l_DAC5541_Abnormal_Flag,
    l_DAC8830_Abnormal_Flag,
    l_ADC7689_Abnormal_Flag,
    l_Current_Source_Open,
    l_Temperature_Chip_Open,
    l_Error_Flag_Count,
} ALIGN4;

union LaserErrorCodeUn
{
    struct
    {
        uint32_t s_SysTick_Abnormal_Flag : 1;     // 系统定时器异常，  置1：异常，置0：正常
        uint32_t s_Id_Abnormal_Flag : 1;          // FLASH存储id异常，置1：异常，置0：正常
        uint32_t s_EEProm_Wt_Abnormal_Flag : 1;   // e2存储异常，置1：异常，置0：正常
        uint32_t s_EEProm_Rd_Abnormal_Flag : 1;   // e2读取异常，置1：异常，置0：正常
        uint32_t s_Write_Value_Abnormal_Flag : 1; // 设置的值异常，  置1：异常，置0：正常
        uint32_t s_Read_Value_Abnormal_Flag : 1;  // 读取的值异常，  置1：异常，置0：正常
        uint32_t l_Ovp_Flag : 1;                  // 电流过压，  置1：异常，置0：正常
        uint32_t l_Ocp_Flag : 1;                  // 电流过流，  置1：异常，置0：正常
        uint32_t l_Ot_Flag : 1;                   // 温度高温，  置1：异常，置0：正常
        uint32_t l_Ut_Flag : 1;                   // 温度低温，  置1：异常，置0：正常
        uint32_t l_ADC1119_Abnormal_Flag : 1;     // ADS1119异常，  置1：异常，置0：正常
        uint32_t l_DAC5541_Abnormal_Flag : 1;     // ADC5541异常，  置1：异常，置0：正常
        uint32_t l_DAC8830_Abnormal_Flag : 1;     // ADC8830异常，  置1：异常，置0：正常
        uint32_t l_ADC7689_Abnormal_Flag : 1;     // ADC7689异常，  置1：异常，置0：正常
        uint32_t l_Current_Source_Open : 1;       // 电流源打开，  置1：打开，置0：关闭
        uint32_t l_Temperature_Chip_Open : 1;     // 温控芯片打开，  置1：打开，置0：关闭
        uint32_t : (32 - l_Error_Flag_Count);
    } one_bit;
    uint32_t all_bit;
} ALIGN4;

enum ErrorMotorInformEn
{
    m_Timer_Abnormal_Flag = s_Error_Flag_Count,
    m_Current_Abnormal_Flag,
    m_ADC7689_Abnormal_Flag,
    m_Run_Abnormal_Flag,
    m_Error_Flag_Count
} ALIGN4;

union MotorErrorCodeUn
{
    struct
    {
        uint32_t s_SysTick_Abnormal_Flag : 1;     // 系统定时器异常，  置1：异常，置0：正常
        uint32_t s_Id_Abnormal_Flag : 1;          // FLASH存储id异常，置1：异常，置0：正常
        uint32_t s_EEProm_Wt_Abnormal_Flag : 1;   // e2存储异常，置1：异常，置0：正常
        uint32_t s_EEProm_Rd_Abnormal_Flag : 1;   // e2读取异常，置1：异常，置0：正常
        uint32_t s_Write_Value_Abnormal_Flag : 1; // 设置的值异常，  置1：异常，置0：正常
        uint32_t s_Read_Value_Abnormal_Flag : 1;  // 读取的值异常，  置1：异常，置0：正常
        uint32_t m_Timer_Abnormal_Flag : 1;       // 定时器异常，置1：异常，置0：正常
        uint32_t m_Current_Abnormal_Flag : 1;     // 电流堵转异常，置1：异常，置0：正常
        uint32_t m_ADC7689_Abnormal_Flag : 1;     // ADC7689异常，  置1：异常，置0：正常
        uint32_t m_Run_Abnormal_Flag : 1;         // 电机转动是否结束，  置1：正在转动（异常），置0：正常
        uint32_t : (32 - m_Error_Flag_Count);
    } one_bit;
    uint32_t all_bit;
} ALIGN4;

/****************************************************************************************************
 * 1.激光子功能枚举定义
 * 2.功能数据类型
 *****************************************************************************************************/

enum LaserChannelTypeEn
{
    LASER_CHANNEL_TYPE_NUM1_E = 0x01, // 一号种子
    LASER_CHANNEL_TYPE_NUM2_E,        // 二号种子
    LASER_CHANNEL_TYPE_NONE_E
} ALIGN4;

enum LaserSwitchStateEn
{
    LASER_SWITCH_STATE_ON_E = 0x01,
    LASER_SWITCH_STATE_OFF_E,
    LASER_SWITCH_STATE_NONE_E
} ALIGN4;

struct LaserSubMessageSt
{
    float Current;
    float Temp;
    float TempCrtCur;
    float PDCurent;
} ALIGN4;

struct LaserSwitchMessageCmdSt
{
    enum LaserChannelTypeEn LaserChannelType;
    enum LaserSwitchStateEn LaserSwitchState;
} ALIGN4;

struct LaserMessageCmdSt
{
    enum LaserChannelTypeEn LaserChannelType;
    struct LaserSubMessageSt LaserSubMessage;
} ALIGN4;

struct LaserVersionCmdSt
{
    uint32_t Version; // 获取指令：版本号
} ALIGN4;

struct LaserResetCmdSt
{
    uint32_t Reset; // 软件复位（只有下发，没有上传）
} ALIGN4;

struct LaserPollCmdSt
{
    // 需要实时轮训获取的值
    float Channel_Current;
    float Channel_Temp;
    float Channel_TempCrtCur;
    float Channe2_Current;
    float Channe2_Temp;
    float Channe2_TempCrtCur;
    float Channe2_PDCurrent;
    uint32_t ErrorCode[2]; // 同时获取下位机运行过程中的实时错误码
} ALIGN4;

struct LaserRefreshCodeCmdSt
{
    uint32_t Refresh; // 错误码刷新
} ALIGN4;

struct TCLimitSt
{
    float low_limit;
    float high_limit;
} ALIGN4;

/* 激光硬件参数结构体*/
struct LaserParameterCmdSt
{
    char name[12]; //"laser_dfb"、"laser_ta"
    uint8_t temp_init_wait_times;// "温度初始化等待时间"
    union
    {
        struct 
        {
            struct TCLimitSt temp_limit;
            struct TCLimitSt seed_cur_limit;
        } laser_dfb;
        struct 
        {
            struct TCLimitSt temp_limit;
            struct TCLimitSt seed_cur_limit;
            struct TCLimitSt ta_pd_cur_limit;
            struct TCLimitSt ta_work_cur_limit;
        } laser_ta;
        uint8_t value[sizeof(struct TCLimitSt) * 4];
    };
} ALIGN4;

/****************************************************************************************************
 * 1.电衰子功能枚举定义
 * 2.功能数据类型
 *****************************************************************************************************/
struct MotorSubValueSt
{
    uint32_t MotorNum;
    uint32_t Position;
} ALIGN4;

struct MotorMessageCmdSt
{
    struct MotorSubValueSt MotorSubValue[4];
} ALIGN4;

struct MotorVersionCmdSt
{
    uint32_t Version; // 获取指令：版本号
} ALIGN4;

struct MotorResetCmdSt
{
    uint32_t Reset; // 软件复位（只有下发，没有上传）
} ALIGN4;

struct MotorPollCmdSt
{
    // 电衰暂时不需要实时轮训获取的值
    uint32_t ErrorCode[4]; // 获取下位机运行过程中的错误码
} ALIGN4;

struct MotorRefreshCodeCmdSt
{
    uint32_t Refresh; // 错误码刷新
} ALIGN4;

struct MotorParameterCmdSt
{
    char name[12]; //"motor_ch32"
    uint16_t max_change_steps;
    uint16_t current_limit;
    uint16_t max_freq;
    uint16_t min_freq;
    uint16_t flexible_freq;
} ALIGN4;

#endif //__tlv_cmd_H__
